package com.bilisummarize.controller;


import com.bilisummarize.bean.ResponseType;
import com.bilisummarize.service.BiliService;
import com.bilisummarize.utils.HttpUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import jakarta.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("api")
public class BiliController {

    @Autowired
    private BiliService biliService;

    /**
     * 获取登录URL
     *
     * @return
     */
    @GetMapping("/getLoginQRCode")
    public String getLoginQRCode() {
//        return HttpUtils.sendGet("https://passport.bilibili.com/qrcode/getLoginUrl");
        return HttpUtils.sendGet("https://passport.bilibili.com/x/passport-login/web/qrcode/generate");

    }


    /**
     * 检查登录状态（轮询）
     *
     * @return
     */
    @GetMapping("/getLoginInfo")
    public HttpUtils.ResponseData getLoginInfo(String oauthKey) {
//        return HttpUtils.sendPostForLogin(oauthKey);
        return HttpUtils.sendGetWithCookies("https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=" + oauthKey);
    }


    /**
     * 根据bv获取详细信息，其中avid和cid很重要
     *
     * @param bv
     * @return
     */
    @GetMapping("/av/{bv}")
    public String getAv(@PathVariable("bv") String bv) {
        return HttpUtils.sendGet("https://api.bilibili.com/x/web-interface/view?bvid=" + bv);
    }

    /**
     * 根据avid和cid请求下载地址接口，获取视频地址
     *
     * @param avid
     * @param cid
     * @return
     */
    @GetMapping("/download/{avid}/{cid}")
    public String getDownloadUrl(@PathVariable("avid") String avid, @PathVariable("cid") String cid,
                                 String SESSDATA) {
//        System.out.println("REQUEST SESSDATA : " + SESSDATA);
        if (SESSDATA.isEmpty()) {
            return HttpUtils.sendGet("https://api.bilibili.com/x/player/playurl?avid=" + avid + "&cid=" + cid + "&qn=80&type=mp4&platform=html5&high_quality=1");
        } else {
            return HttpUtils.sendGetWithCookie("https://api.bilibili.com/x/player/playurl?avid=" + avid + "&cid=" + cid + "&qn=80&type=mp4&platform=html5&high_quality=1", SESSDATA);
        }
    }

//    下方是B站视频总结器的接口，由于目前前端实现方式上可能需要探索，因此每个接口都预留了由URL请求ait+cid的模式和直接提供aid+cid详情请求的模式

    /**
     * 从当前URL的视频中 尝试在数据库里寻找相应的解析
     * 如果有解析，则data返回解析内容
     * 如果没有解析，则返回data为空
     */
    @GetMapping("/getSummarize")
    public ResponseType getSummarize(String url){
        return biliService.getSummarize(url);
    }

    /**
     * 尝试获取给定的aid cid视频的解析
     * 如果有解析，则data返回解析内容
     * 如果没有解析，则返回data为空
     */
    @GetMapping("/getSummarizeWithDetail")
    public ResponseType getSummarizeWithDetail(Integer aid, Integer cid){
        return biliService.getSummarizeWithDetail(aid, cid);
    }

    /**
     * 从当前URL的视频中 提取字幕并形成总结
     * 涉及许多步的操作与判断
     * 【如果当前用户没有登录（或者次数超出每日限制），则返回错误】
     * 先解析URL，找出对应视频，并在数据库中检索是否有本视频的解析
     * 如果有，直接从数据库返回解析内容
     * 如果没有，则调用chatgpt生成解析内容并插入数据库
     */
    @PostMapping("/summarize")
    public ResponseType summarize(String url, String sessdata,
                                  HttpServletResponse httpServletResponse){

        return biliService.summarize(url,sessdata,httpServletResponse);
    }


    /**
     * 从给到的视频信息(aid+cid)与字幕请求URL中
     * 先检查数据库中是否有该视频的总结，如果有，直接返回该总结；
     * 如果没有，则请求该url的字幕并重组，发给gpt，生成总结存数据库
     */
    @PostMapping("/summarizeWithDetail")
    public ResponseType summarizeWithDetail(Integer aid, Integer cid, String subtitleUrl, String title,
                                            HttpServletResponse httpServletResponse){

        return biliService.summarizeWithDetail(aid,cid,subtitleUrl,title,httpServletResponse);
    }

    /**
     * 在当前视频总结的基础上
     * 进一步提问和对话
     * 如果当前的视频没有总结，则返回错误
     */
    @PostMapping("/chat")
    public ResponseType chat(String url, String sessdata, String userText,
                             HttpServletResponse httpServletResponse){

        return biliService.chat(url,sessdata,userText,httpServletResponse);
    }


    /**
     * 提供aid+cid的版本
     * 在当前视频总结的基础上
     * 进一步提问和对话
     * 如果当前的视频没有总结，则返回错误
     */
    @PostMapping("/chatWithDetail")
    public ResponseType chatWithDetail(Integer aid, Integer cid, Integer userId, String userText,
                                       HttpServletResponse httpServletResponse){
        return biliService.chatWithDetail(aid,cid, userId ,userText,httpServletResponse);
    }

    /**
     * 获取用户今日剩余次数
     */
    @GetMapping("/getUserScore")
    public ResponseType getUserScore(Integer userId){
        return biliService.getUserScore(userId);
    }

    /**
     * 就是一个测试链接的接口
     *
     */
    @GetMapping("/testConnection")
    public ResponseType testConnection(){
        return new ResponseType("链接OK测试通过");
    }
}
